/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package hormigas_packettracker.grasp;

import hormigas_packettracker.Heuristica;
import hormigas_packettracker.beans.Carro;
import hormigas_packettracker.beans.Moto;
import hormigas_packettracker.beans.Path;
import hormigas_packettracker.beans.Pedido;
import hormigas_packettracker.beans.Punto;
import hormigas_packettracker.beans.Vehiculo;
import hormigas_packettracker.config.Parameters;
import hormigas_packettracker.config.Solucion;
import java.util.ArrayList;

/**
 *
 * @author Shadow
 */
public class Grasp  {
/*
    private boolean _terminoVehiculo = false;
    private int _velocidadActual;
    private Path _rutaActual;

    
    public void obtenerSolucion(ArrayList<Pedido> pedidos) {
        Solucion solucion = new Solucion();
        Parameters.vSol.setSolucion(solucion);
        Parameters.vSol.setVisible(true);
        double bestCost = Double.MAX_VALUE;
        for (int i = 0; i < Parameters.getNumVehiculos(); i++) {
            Vehiculo v = Parameters.getVehiculo(i);
            _terminoVehiculo = false;
            _velocidadActual = v.getVelocidad();
            _rutaActual = v.getRuta();
            while (!_terminoVehiculo) {
                move(v, pedidos);
            }

            Parameters.vSol.update(Parameters.vSol.getGraphics());

        }
    }

    public void move(Vehiculo v, ArrayList<Pedido> pedidos) {
        Pedido bestNodo = null;
        int pedidoIndex = 0;
        double mejorPeso = Double.MAX_VALUE;
        ArrayList<Pedido> listaPosibles = new ArrayList<>();
        for (int i = 0; i < pedidos.size(); i++) {
            Pedido sgtePedido = pedidos.get(i);
            if (!isFeasible(sgtePedido)) {
                continue;
            }
            double pesoActual = calcularPeso(sgtePedido);
            if (mejorPeso > pesoActual) {
                bestNodo = sgtePedido;
                pedidoIndex = i;
            }
        }
        if (bestNodo == null) {
            _terminoVehiculo = true;
            return;
        }
        _rutaActual.add(bestNodo.getUbicacion());
        v.setCapacidadActual(v.getCapacidadActual() - bestNodo.getDemanda());
        pedidos.remove(pedidoIndex);
    }

    private boolean isFeasible(Pedido sgtePedido) {
        boolean capacityConstraint = (sgtePedido.getDemanda() <= this._capacidadActual);
        if (_rutaActual.size() == 0) {
            return capacityConstraint;
        }
        double distance = Punto.distanceBetween(sgtePedido.getUbicacion(), _rutaActual.get(_rutaActual.size() - 1));
        double time = distance / _velocidadActual;
        boolean timeConstraint = (sgtePedido.getVentanaTiempoActual() >= time);
        // boolean fuelConstraint = (distance * _consumoPorKm < _gasolinaActual);
        return capacityConstraint && timeConstraint;  // && fuelConstraint 
    }

    private double calcularPeso(Pedido pedido) {
        double factorDistancia = (_rutaActual.size() > 0 ? Punto.distanceBetween(pedido, _rutaActual.get(_rutaActual.size() - 1)) : 1);
        //double factorCombustible = factorDistancia * _consumoPorKm;
        double factorTiempo = pedido.getVentanaTiempoActual() - factorDistancia / _velocidadActual;
        return 1 / factorDistancia + 1 / factorTiempo; //* 1/factorCombustible
    }*/
}
